package org.lanqiao.taru.controller;


import lombok.extern.slf4j.Slf4j;
import org.lanqiao.taru.common.Result;
import org.lanqiao.taru.vo.FileVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

import  org.lanqiao.taru.vo.TempFileVo;
import org.springframework.web.multipart.MultipartFile;

import  java.util.List;

@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {






    /**
     * Value+${} 表示从属性配置文件中取值
     */
    @Value("${my.uploadPath}")
    private  String  uploadFilePath;





    @GetMapping("/ceshi")
    public Result  ceshi(){
        System.out.println("哈哈哈");
        return  Result.OK("测试成功","success");

    }



    /**
     * 列出当前系统的盘符或根目录
     * @return
     */
    @GetMapping("/root")
    public Result    listRoot(){
       File []  files =   File.listRoots();
       return  Result.OK("查询盘符成功",files);
    }



    /**
     *  根据具体的path。查询当前path有哪些文件
     *  http://localhost:3000/file/listFiles
     * @return
     */
    @PostMapping("/listFiles")
    public Result    listFiles(  @RequestBody  TempFileVo  tempFileVo  ){
        File  file  =new File(tempFileVo.getPath());
        if(file.isDirectory()){
            File[]  files  =file.listFiles();
            return  Result.OK("查询目录成功",files);
        }else{
            return  Result.OK("这是一个具体的文件，不能在继续了 ",null);
        }

    }


    /**
     * 优化方法
     * @param tempFileVo
     * @return
     */
    @PostMapping("/listFiles2")
    public Result    listFiles2(  @RequestBody  TempFileVo  tempFileVo  ){
        System.out.println("需要遍历的目录是："+tempFileVo.getPath());
        File  file  =new File(tempFileVo.getPath());
        if(file.isDirectory()){
            File[]  files  =file.listFiles();

    /*        ArrayList<FileVo>  fileVosList =new ArrayList<>();
            for(File  f:files){
                FileVo  fileVo =new FileVo();
                if(f.isFile()){
                    fileVo.setFlag("1");
                    fileVo.setPath(f.getAbsolutePath())

                }else{
                    fileVo.setFlag("0");
                     fileVo.setPath(f.getAbsolutePath())
                }
                fileVosList.add(fileVo);

            }
*/


            //把file变成FileVo      这样file就标识  1表示文件  0表示文件夹
            List<FileVo> fileVoList  =    Arrays.stream(files).map(f ->new FileVo(f.getAbsolutePath(),f.isFile()?"1":"0")).collect(Collectors.toList());
            return  Result.OK("查询目录成功",fileVoList);
        }else{
            return  Result.OK("这是一个具体的文件，不能在继续了 ",null);
        }

    }


    /**
     * 展示文件的具体内容（ 如果是一个图片，展示图片，如果是一个文本内容，展示文本，如果是其他 弹框显示 可执行文件，拒绝执行）
     * @param tempFileVo
     * @return
     */
    @PostMapping("/showFile")
    public Result    showFile(  @RequestBody  TempFileVo  tempFileVo  ){
       return  null;

    }


    /**
     *
     * @param myFile  上传文件字段名
     * @return
     */
    @PostMapping("/upload")
    public   Result    commonUploadFile( @RequestParam("myFile")  MultipartFile    myFile ){
        if(myFile.isEmpty()){
              return  Result.FAIL("上传文件是空");
        }
        //重命名：时间戳+文件后缀
        String  newName=System.currentTimeMillis()+"_"+myFile.getOriginalFilename().substring(myFile.getOriginalFilename().lastIndexOf("."));
        try {
            //如果文件目录不存在就创建文件夹
            File file  =new File(uploadFilePath);
            if(!file.exists()){
                file.mkdir();
            }
            // 把文件运输到指定的服务器目录中
            myFile.transferTo(new File(uploadFilePath+newName));
        } catch (IOException e) {
            log.error("上传文件异常{}",e.getMessage());
            return  Result.FAIL("上传文件异常");
        }
        return  Result.OK("上传文件成功",newName);

    }


}
